package com.yinhe.music.common.utils;

import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author genchengxiang
 * @version 1.9.0
 * @date 2015-11-24
 * @filecomment
 */
public class JsonUtil {
    /**
     * json序列化工具
     */
    private final static Gson gson;
    /**
     * json反序列化工具
     */
    private final static Gson gsonDes;

    static {
        gson = new GsonBuilder().create();
        gsonDes = new GsonBuilder().create();
    }

    /**
     * @param obj 待序列化JavaBean
     * @return
     * @description: 将JavaBean序列化成Json字符串(默认启用属性名小驼峰自动转下划线策略)
     * @since: 1.0
     * @author：genchengxiang
     * @createtime：2015年12月4日
     */
    public final static String toString(Object obj) {
        return toString(obj, true);
    }

    /**
     * @param obj         待序列化JavaBean
     * @param underscores true启用属性名小驼峰自动转下划线策略,false按照原始属性名称处理
     * @return
     * @description: 将JavaBean序列化成Json字符串
     * @since: 1.0
     * @author：genchengxiang
     * @createtime：2015年12月4日
     */
    public final static String toString(Object obj, boolean underscores) {
        if (underscores) {
            return gson.toJson(obj);
        } else {
            return gsonDes.toJson(obj);
        }
    }

    /**
     * @param jsonStr 待反序列化Json字符串
     * @param type    期望结果的数据类型
     * @return
     * @description:将Json字符串反序列化为JavaBean(默认按照原始属性名处理)
     * @since: 1.0
     * @author：genchengxiang
     * @createtime：2015年12月4日
     */
    public final static <T> T toObject(String jsonStr, Class<T> type) {
        return toObject(jsonStr, type, false);
    }

    /**
     * @param jsonStr     待反序列化Json字符串
     * @param type        期望结果的数据类型
     * @param underscores true启用属性名小驼峰自动转下划线策略,false按照原始属性名称处理
     * @return
     * @description:将Json字符串反序列化为JavaBean
     * @since: 1.0
     * @author：genchengxiang
     * @createtime：2015年12月4日
     */
    public final static <T> T toObject(String jsonStr, Class<T> type, boolean underscores) {

        if (underscores) {
            return gson.fromJson(jsonStr, type);
        } else {
            return gsonDes.fromJson(jsonStr, type);
        }
    }


    /**
     * 将Map转化为Json字符串
     *
     * @param map
     * @return String
     */
    public static <T> String mapToJson(Map<String, T> map) {
        Gson gson = new Gson();
        return gson.toJson(map);
    }

    /**
     * 将Object转化为Json字符串
     *
     * @param object
     * @return String
     */
    public static <T> String ObjectToJson(Object object) {
        Gson gson = new Gson();
        return gson.toJson(object);
    }

    /**
     * 将数组转化为Json字符串
     *
     * @param idList int数组
     * @return String
     */
    public static <T> String getJsonArray(int[] idList) {
        JsonArray jsonArray = new JsonArray();
        for (int id : idList) {
            jsonArray.add(id);
        }
        return ObjectToJson(jsonArray);
    }

    /**
     * 将List数组转化为Json字符串
     *
     * @param idList int数组
     * @return String
     */
    public static String getJsonArray(List<Integer> idList) {
        JsonArray jsonArray = new JsonArray();
        for (int id : idList) {
            jsonArray.add(id);
        }
        return ObjectToJson(jsonArray);
    }

    /**
     * 解析没有数据头的纯数组
     */
    public static <T> ArrayList<T> parseNoHeaderJArray(String strByJson, Class<T> T) {
        ArrayList<T> beanList = new ArrayList<>();
        try {
            JsonParser parser = new JsonParser();
            JsonArray jsonArray = parser.parse(strByJson).getAsJsonArray();
            for (JsonElement user : jsonArray) {
                T t = gson.fromJson(user, T);
                beanList.add(t);
            }
        } catch (Exception e) {
            Log.e("JsonUtil", e.getMessage());
        }
        return beanList;
    }
}
